#include "Shm.hpp"  // 包含“共享内存管理类” 
#include "Fifo.hpp" // 包含“命名管道操作类” + “文件操作类”

int main()
{
    /*---------------------------命名管道---------------------------*/
    //1.初始化命名管道写端对象
    FileOperator writerfile(PATH, FILENAME);

    //2.以只写模式打开命名管道 ---> 若读端未打开，此调用会阻塞，直到读端打开后返回
    writerfile.OpenForWrite();


    /*---------------------------共享内存---------------------------*/
    //第一步：初始化共享内存对象 ---> 作为"使用者（USER）"获取已存在的共享内存
    Shm shm(PathName, ProjId, USER); 

    //第二步：获取共享内存映射到当前进程的虚拟地址起始指针，并强转为char*（方便字节级读写）
    char *mem = (char *)shm.GetPtr();

    /* 关键说明：
    *    1. 对共享内存的读写操作直接通过虚拟地址访问，无需调用read/write等系统调用
    *    2. 相比管道、消息队列等IPC，共享内存是最快的，因为减少了内核态与用户态的数据拷贝
    */

    int index = 0;  
    //第三步：循环向共享内存写入数据 ---> 从字符'A'写到'B'，每次写入2个相同字符
    for (char c = 'A'; c <= 'D'; c++, index += 2)
    {
        //1：模拟业务处理延迟，便于观察程序运行过程
        sleep(1);  

        //2：向共享内存写入数据：通过虚拟地址mem直接赋值（无系统调用开销）
        mem[index] = c;       // 第index位置写入字符c
        mem[index + 1] = c;   // 第index+1位置写入字符c（连续存储2个相同字符）

        //3：模拟数据写入完成后的延迟
        sleep(1);  

        //4：写入字符串结束符'\0'，方便读端按字符串解析
        mem[index + 2] = 0;  

        //5：通过命名管道发送"唤醒信号" ---> 通知读端共享内存已有新数据可读取
        writerfile.Wake_Write(); // 本质是向管道写入1字节数据，解除读端的read阻塞
    }

    /*--------------------------------------------------------------------------------------------------*/

    //3.关闭命名管道的文件描述符，释放资源
    writerfile.Close();

    return 0;
}